$Description$
有$m$只$doge$分布在$n$个摩天大楼上。楼和$doge$都是从$0$开始编号。
每只$doge$初始位置$b[i]$,弹跳力$p[i]$。 它每一次跳会恰好跳$p[i]$个大楼。比如从$x$可以到$x±p[i]$。
现在,$0$号$doge$要把某信息传给$1$号$doge$。对于一只$doge$,若它尚未知道信息,就不能动。 对于一只$doge$,若它已经知道信息,可以选择把信息告诉处于同一位置的$doge$们,或者跳去别的位置。
求最少跳的步数。
$Solution$
先考虑暴力
对于每一只$doge$,我们从$b[i]$ 连边到所有它可以跳到(可以跳好多步)的位置,边权为需要跳的次数。
从$b[0]$跑一下最短路即可。
但是,这样边数太多了。
那么考虑一下分块,把每一座摩天大楼拆成$O(\sqrt{n})$层,第$0$层表示原点,第$j$层代表一步能跳到$b[i]±j$的摩天大楼,如果某座摩天大楼的$p[i]>size$则暴力从该摩天大楼的原点向$b[i]±j$的摩天大楼的原点连边,然后这一层每一个摩天大楼向它能到达的摩天大楼的相同层连双向边,并且每座摩天大楼的每一层都要向该摩天大楼的原点连边,可以保证边数在$n\sqrt{n}$级别左右(视$n,m$同阶)
$Code$
1 |
|